home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue35 / eval_dan / EVAL_DAN.ZIP / mathtest.~pa < prev    next >
Text File  |  1997-12-30  |  4KB  |  181 lines

  1. unit mathtest;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   mathcomp, StdCtrls, ComCtrls, Tabnotbk;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     EDT_Expression: TEdit;
  12.     BTN_MakeTree: TButton;
  13.     TreeView: TTreeView;
  14.     BTN_Evaluate: TButton;
  15.     LBL_Value: TLabel;
  16.     Notebook: TTabbedNotebook;
  17.     MEMO_Tokens: TMemo;
  18.     LB_Vars: TListBox;
  19.     Label1: TLabel;
  20.     EDT_VarName: TEdit;
  21.     Label2: TLabel;
  22.     EDT_VarData: TEdit;
  23.     BTN_New: TButton;
  24.     BTN_Delete: TButton;
  25.     BTN_Change: TButton;
  26.     BTN_Clear: TButton;
  27.     procedure FormCreate(Sender: TObject);
  28.     procedure FormDestroy(Sender: TObject);
  29.     procedure BTN_MakeTreeClick(Sender: TObject);
  30.     procedure BTN_EvaluateClick(Sender: TObject);
  31.     procedure BTN_ChangeClick(Sender: TObject);
  32.     procedure BTN_NewClick(Sender: TObject);
  33.     procedure BTN_DeleteClick(Sender: TObject);
  34.     procedure BTN_ClearClick(Sender: TObject);
  35.   private
  36.     { Private declarations }
  37.   public
  38.     { Public declarations }
  39.     procedure UpdateVarsLB;
  40.   end;
  41.  
  42. var
  43.   Form1: TForm1;
  44.   Tree: TExpressionTree;
  45.  
  46. implementation
  47.  
  48. {$R *.DFM}
  49.  
  50. procedure TForm1.UpdateVarsLB;
  51. var
  52. i: longint;
  53. PVar: PVariableRecord;
  54. begin
  55.   if Tree.VarList.Count > 0 then
  56.   begin
  57.     LB_Vars.Clear;
  58.     for i := 0 to Tree.Varlist.count-1 do
  59.     begin
  60.       PVar := PVariableRecord(Tree.VarList.Items[i]);
  61.       LB_Vars.Items.Add(PVar^.VarName+': '+FloatToStr(PVar^.VarData));
  62.     end;
  63.   end;
  64. end;
  65.  
  66. procedure TForm1.FormCreate(Sender: TObject);
  67. begin
  68.   Tree := TExpressionTree.Create;
  69.   Tree.VarList := TVarList.Create;
  70. end;
  71.  
  72. procedure TForm1.FormDestroy(Sender: TObject);
  73. begin
  74.   Tree.VarList.Free;
  75.   Tree.Free;
  76. end;
  77.  
  78. procedure TForm1.BTN_MakeTreeClick(Sender: TObject);
  79.  
  80. procedure DoTree(CNode: TExpressionNode; ONode: TTreeNode);
  81. var
  82. i: longint;
  83. begin
  84.   ONode := TreeView.Items.AddChild(ONode,CNode.Value);
  85.   if CNode.Children.Count>0 then
  86.   begin
  87.     for i := 0 to CNode.Children.Count-1 do
  88.       DoTree(TExpressionNode(CNode.Children.items[i]),ONode);
  89.   end;
  90. end;
  91.  
  92. begin
  93.   Tree.Expression := EDT_Expression.Text;
  94.   MEMO_Tokens.Lines.Assign(Tree.Tokens);
  95.   if Assigned(Tree.TopNode) then
  96.   begin
  97.     TreeView.Items.Clear;
  98.     DoTree(Tree.TopNode,TreeView.Selected);
  99.     TreeView.FullExpand;
  100.   end;
  101. end;
  102.  
  103. procedure TForm1.BTN_EvaluateClick(Sender: TObject);
  104. begin
  105.   if Assigned(Tree.TopNode) then
  106.   begin
  107.     Tree.TopNode.Evaluate(False,True);
  108.     LBL_Value.Caption := FloatToStr(Tree.TopNode.NumValue);
  109.     if not Tree.TopNode.ValidValue then
  110.       LBL_Value.Caption := LBL_Value.Caption + ' [Not valid]';
  111.     UpdateVarsLB;
  112.   end;
  113. end;
  114.  
  115. procedure TForm1.BTN_ChangeClick(Sender: TObject);
  116. var
  117. tf: Double;
  118. PVar: PVariableRecord;
  119. begin
  120.   if (LB_Vars.ItemIndex>-1) and (Tree.VarList.Count>0) then
  121.   begin
  122.     if EDT_VarName.Text <> '' then
  123.     begin
  124.       try
  125.         tf := StrToFloat(EDT_VarData.Text);
  126.         //It worked--set data and update
  127.         PVar := PVariableRecord(Tree.VarList.items[LB_Vars.ItemIndex]);
  128.         PVar^.VarName := EDT_VarName.Text;
  129.         PVar^.VarData := tf;
  130.         UpdateVarsLB;
  131.       except
  132.         on EConvertError do
  133.         begin
  134.           ShowMessage(EDT_VarData.Text+' is not a valid numeric value.');
  135.           Exit;
  136.         end;
  137.       end;
  138.     end;
  139.   end;
  140. end;
  141.  
  142. procedure TForm1.BTN_NewClick(Sender: TObject);
  143. var
  144. tf: double;
  145. begin
  146.   if EDT_VarName.Text<> '' then
  147.   begin
  148.     try
  149.       tf := StrToFloat(EDT_VarData.Text);
  150.       //It worked--create new variable and update
  151.       Tree.VarList.NewVar(EDT_VarName.Text,tf);
  152.       UpdateVarsLB;
  153.     except
  154.       on EConvertError do
  155.       begin
  156.         ShowMessage(EDT_VarData.Text+' is not a valid numeric value.');
  157.         Exit;
  158.       end;
  159.     end;
  160.   end;
  161. end;
  162.  
  163. procedure TForm1.BTN_DeleteClick(Sender: TObject);
  164. begin
  165.   if (LB_Vars.ItemIndex > -1) and (Tree.VarList.Count>0) then
  166.   begin
  167.     Dispose(PVariableRecord(Tree.VarList.items[LB_Vars.ItemIndex]));
  168.     Tree.VarList.Delete(LB_Vars.ItemIndex);
  169.     UpdateVarsLB;
  170.   end;
  171. end;
  172.  
  173. procedure TForm1.BTN_ClearClick(Sender: TObject);
  174. begin
  175.   Tree.VarList.Free;
  176.   Tree.VarList := TVarList.Create;
  177.   LB_Vars.Clear;
  178. end;
  179.  
  180. end.
  181.